home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
AMICUS
/
AMICUS11.ADF
/
C
/
cpri.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-08-05
|
3KB
|
102 lines
/*
* C P R I : This allows you to muck around with the priorities of
* running AmigaDOS processes.
*/
#include <stdio.h>
#include <ctype.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <exec/tasks.h>
/* Externs */
extern struct DosLibrary *DOSBase; /* dos library base pointer */
extern struct FileLock *Output(); /* get output file handle */
extern short SetTaskPri(); /* sets priority for specified task */
/* Globals */
static struct FileLock *OutLock; /* used by WSTR define */
/* Defines */
/* Use AmigaDOS i/o to keep executable size down */
#define WSTR(s) (void)Write(OutLock, s, (long)strlen(s))
/* Casting conveniences */
#define ROOTNODE ((struct RootNode *)DOSBase->dl_Root)
main(argc, argv)
int argc;
char **argv;
{
void usage();
char *pris = argv[1];
int sign = 1;
long pri, atol();
struct Task *tcb;
unsigned long *tt, procnum;
struct Task *task;
UBYTE *port;
OutLock = Output();
if (argc != 3) usage();
/* Handle any leading + or - sign */
if (*pris == '+') {
pris++;
} else if (*pris == '-') {
pris++;
sign = -1;
}
/* What's left must be a digit string */
if (*pris == '\0' || (!isdigstr(pris)) ) usage();
pri = atol(pris) * sign; /* got the priority */
/* Bound check the priority */
if (pri < -128 || pri > 127) {
WSTR("Bad priority: range is -128 to 127\n");
exit(20);
}
/* The second parameter should be a CLI procnum */
if ( !isdigstr(argv[2]) ) usage();
procnum = atol(argv[2]);
tt = (unsigned long *)(BADDR(ROOTNODE->rn_TaskArray));
/* Validate with range check */
if (procnum > tt[0] || tt[procnum] == 0L) {
WSTR("Invalid process number\n");
exit(20);
}
Forbid(); /* task mustn't go away while we fiddle with it */
port = (UBYTE *)tt[procnum];
tcb = (struct Task *)(port - sizeof(struct Task));
/* Now we have a task, let's set its priority */
(void)SetTaskPri(tcb, pri);
Permit();
}
void
usage()
{
WSTR("usage: cpri [+/-]priority CLI-process-number\n");
exit(20);
}
isdigstr(s)
char *s;
{
register char *p;
for(p =s ; *p != '\0'; p++)
if (!isdigit(*p) )
return 0;
return 1;
}